// use std::mem;
use std::string::String;

struct Solution {}

impl Solution {
    pub fn last_substring(s: String) -> String {
        let slice = s.as_bytes();

        // let mut i = 0;
        // let mut j = 1;
        // let mut n = s.len();
        // 加括号可以代替上面的：不用括号报错的！
        let (mut i, mut j, n) = (0, 1, s.len());
        while j < n {
            let mut k = 0;
            // s[i+k] 报错
            while j + k < n && slice[i+k] == slice[j+k] {
                // k++ 报错，rust 不支持！
                k+=1;
            }
            if j + k < n && slice[i+k] < slice[j+k] {
                // 这个不知道可不可？？ // 结果错误
                // i = j;
                // j = j.max(j+1);
                // j = j.max(i+k+1);

                // j = (j+1).max(i+k+1);
                // mem::swap(&mut i, &mut j); // 报错

                let tmp = i;
                i = j;
                // j = (tmp + 1).max(tmp + k +1); // 错误
                j = (j + 1).max(tmp + k +1);


            } else {
                j = j + k + 1;
            }
        }
        // s[i:] 报错，不支持
        return s[i..].to_string()
    }
}


#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_1() {
        // 报错
        // let s = String.from("abab");
        let s = "abab";
        let expected = "bab";

        // 要加to_string()
        let ans = Solution::last_substring(s.to_string());
        println!("ans: {}", ans);
        assert_eq!(ans, expected);
    }

    #[test]
    fn test_2() {
        let s = "vmjtxddvzmwrjvfamgpoowncslddrkjhchqswkamnsitrcmnhn";
        let expected = "zmwrjvfamgpoowncslddrkjhchqswkamnsitrcmnhn";

        let ans = Solution::last_substring(s.to_string());
        println!("ans: {}", ans);
        assert_eq!(ans, expected);
    }
}